/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao.thuoc;

import java.util.List;
import model.entity.Thuoc;
import model.util.HibernateUtil;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;

/**
 *
 * @author luanp_000
 */
public class ThuocDAO {

//  Câu query hibernate có chức năng load tất cả loại thuốc.
    private static final String LOAD_ALL_THUOC = "FROM Thuoc";

//  Câu query hibernate có chức năng load lên 1 loại thuốc dựa vào thuocMa.
    private static final String LOAD_BY_THUOC_ID = "FROM Thuoc th WHERE th.thuocMa =";

    //  Câu query hibernate có chức năng load danh sách thuốc dựa vào thuocTen.
    private static final String LOAD_BY_THUOC_NAME = "FROM Thuoc th WHERE th.thuocTen LIKE ";

    //  Câu query hibernate có chức năng load danh sách thuốc dựa vào giaBan.
    private static final String LOAD_BY_GIABAN = "FROM Thuoc th WHERE th.gia.giaBan =";

    //  Câu query hibernate có chức năng load danh sách thuốc dựa vào giaGoc.
    private static final String LOAD_BY_GIAGOC = "FROM Thuoc th WHERE th.gia.giaGoc =";

    //  Câu query hibernate có chức năng load danh sách thuốc dựa vào nccMa.
    private static final String LOAD_BY_NCC_ID = "FROM Thuoc th WHERE th.nhaCungCap.nccMa =";

    //  Câu query hibernate có chức năng load danh sách thuốc dựa vào nccMa.
    private static final String LOAD_BY_SOLUONG = "FROM Thuoc th WHERE th.soLuong =";

    /**
     * Thêm mới 1 loại thuốc
     *
     * @param thuoc đối tượng thuốc cần thêm.
     * @return id của đối tượng vừa insert.
     */
    public final static int insert(Thuoc thuoc) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        int id;
        try {
            session.beginTransaction();
            session.save(thuoc);
            session.getTransaction().commit();
            id = thuoc.getThuocMa();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
        return id;
    }

    /**
     * Sửa thông tin 1 loại thuốc.
     *
     * @param thuoc đối tượng thuốc sẽ được sửa thông tin.
     */
    public static final void update(Thuoc thuoc) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            session.update(thuoc);
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }

    /**
     * Xóa 1 loại thuốc.
     *
     * @param thuocMa mã đối tượng thuốc sẽ bị xóa.
     */
    public static final void delete(int thuocMa) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Thuoc thuoc = loadByThuocID(thuocMa).get(0);
        try {
            session.beginTransaction();
            session.delete(thuoc);
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }

    /**
     * Load tất cả loại thuốc vào 1 List
     *
     * @return List danh sách tất cả các loại thuốc. Mỗi 1 đối tượng trong List
     * trả về là 1 dòng (row) trong database.
     */
    public static final List loadAllThuoc() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        List<Thuoc> resultList;
        try {
            session.beginTransaction();
            resultList = session.createQuery(LOAD_ALL_THUOC).list();
            for (Thuoc thuoc : resultList) {
                Hibernate.initialize(thuoc.getGia());
                Hibernate.initialize(thuoc.getNhaCungCap());;
            }
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
        return resultList;
    }

    public static final List<Thuoc> loadByThuocID(int thuocMa) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        List<Thuoc> resultList;
        try {
            session.beginTransaction();
            resultList = session.createQuery(LOAD_BY_THUOC_ID + thuocMa).list();
            for (Thuoc thuoc : resultList) {
                Hibernate.initialize(thuoc.getGia());
                System.out.println(thuoc.getGia());
                Hibernate.initialize(thuoc.getNhaCungCap());
                System.out.println(thuoc.getNhaCungCap());
            }
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
        if (resultList.isEmpty()) {
            return null;
        } else {
            return resultList;
        }
    }

    public static final List<Thuoc> loadByThuocName(String thuocTen) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        List<Thuoc> resultList;
        try {
            session.beginTransaction();
            resultList = session.createQuery(LOAD_BY_THUOC_NAME + "'%" + thuocTen + "%'").list();
            for (Thuoc thuoc : resultList) {
                Hibernate.initialize(thuoc.getGia());
                System.out.println(thuoc.getGia());
                Hibernate.initialize(thuoc.getNhaCungCap());
                System.out.println(thuoc.getNhaCungCap());
            }
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
        if (resultList.isEmpty()) {
            return null;
        } else {
            return resultList;
        }
    }

    public static final List<Thuoc> loadBySoLuong(int soLuong) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        List<Thuoc> resultList;
        try {
            session.beginTransaction();
            resultList = session.createQuery(LOAD_BY_SOLUONG + soLuong).list();
            for (Thuoc thuoc : resultList) {
                Hibernate.initialize(thuoc.getGia());
                System.out.println(thuoc.getGia());
                Hibernate.initialize(thuoc.getNhaCungCap());
                System.out.println(thuoc.getNhaCungCap());
            }
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
        if (resultList.isEmpty()) {
            return null;
        } else {
            return resultList;
        }
    }

    public static final List<Thuoc> loadByNccID(int nccMa) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        List<Thuoc> resultList;
        try {
            session.beginTransaction();
            resultList = session.createQuery(LOAD_BY_NCC_ID + nccMa).list();
            for (Thuoc thuoc : resultList) {
                Hibernate.initialize(thuoc.getGia());
                System.out.println(thuoc.getGia());
                Hibernate.initialize(thuoc.getNhaCungCap());
                System.out.println(thuoc.getNhaCungCap());
            }
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
        if (resultList.isEmpty()) {
            return null;
        } else {
            return resultList;
        }
    }

    public static final List<Thuoc> loadByGiaGoc(int giaGoc) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        List<Thuoc> resultList;
        try {
            session.beginTransaction();
            resultList = session.createQuery(LOAD_BY_GIAGOC + giaGoc).list();
            for (Thuoc thuoc : resultList) {
                Hibernate.initialize(thuoc.getGia());
                System.out.println(thuoc.getGia());
                Hibernate.initialize(thuoc.getNhaCungCap());
                System.out.println(thuoc.getNhaCungCap());
            }
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
        if (resultList.isEmpty()) {
            return null;
        } else {
            return resultList;
        }
    }

    public static final List<Thuoc> loadByGiaBan(int giaBan) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        List<Thuoc> resultList;
        try {
            session.beginTransaction();
            resultList = session.createQuery(LOAD_BY_GIABAN + giaBan).list();
            for (Thuoc thuoc : resultList) {
                Hibernate.initialize(thuoc.getGia());
                System.out.println(thuoc.getGia());
                Hibernate.initialize(thuoc.getNhaCungCap());
                System.out.println(thuoc.getNhaCungCap());
            }
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
        if (resultList.isEmpty()) {
            return null;
        } else {
            return resultList;
        }
    }

    /**
     * Sửa số lượng còn lại của 1 loại thuốc
     *
     * @param thuocMa mã đối tượng thuốc cần sửa số lượng.
     * @param slthaydoi số lượng cần sửa (số âm hoặc số dương).
     */
    public static final void updateSoLuongThuoc(int thuocMa, int slthaydoi) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Thuoc thuoc = loadByThuocID(thuocMa).get(0);
        int slCu = thuoc.getSoLuong();
        thuoc.setSoLuong(slCu + slthaydoi);
        try {
            session.beginTransaction();
            session.update(thuoc);
            session.getTransaction().commit();
        } catch (HibernateException e) {
            session.getTransaction().rollback();
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }
}
